// Math Functions (数学函数) 示例
// 演示 Pascal 中数学函数的各种用法
program p_45_math_functions;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils,      // 系统工具单元
  Math;          // 数学单元

// 基本数学运算函数示例
procedure BasicMathFunctions;
var
  x, y: Double;
begin
  WriteLn('1. 基本数学运算函数:');
  x := -5.7;
  y := 3.2;
  
  WriteLn('  给定 x = ', x:0:2, ', y = ', y:0:2);
  WriteLn('  绝对值 Abs(x) = ', Abs(x):0:2);
  WriteLn('  平方 Sqr(y) = ', Sqr(y):0:2);
  WriteLn('  平方根 Sqrt(Sqr(y)) = ', Sqrt(Sqr(y)):0:2);
  WriteLn('  幂运算 Power(y, 3) = ', Power(y, 3):0:2);
  WriteLn('  最大值 Max(x, y) = ', Max(x, y):0:2);
  WriteLn('  最小值 Min(x, y) = ', Min(x, y):0:2);
  WriteLn('  符号函数 Sign(x) = ', Sign(x));
  WriteLn('  符号函数 Sign(y) = ', Sign(y));
end;

// 三角函数示例
procedure TrigonometricFunctions;
var
  angleDeg, angleRad: Double;
begin
  WriteLn('2. 三角函数:');
  angleDeg := 30.0;
  angleRad := DegToRad(angleDeg);
  
  WriteLn('  角度 = ', angleDeg:0:1, '°');
  WriteLn('  弧度 = ', angleRad:0:6);
  WriteLn('  正弦 Sin(angle) = ', Sin(angleRad):0:6);
  WriteLn('  余弦 Cos(angle) = ', Cos(angleRad):0:6);
  WriteLn('  正切 Tan(angle) = ', Tan(angleRad):0:6);
  
  WriteLn;
  var sineValue: Double := 0.5;
  WriteLn('  反三角函数 (输入值 = ', sineValue:0:1, '):');
  WriteLn('  反正弦 ArcSin(', sineValue:0:1, ') = ', RadToDeg(ArcSin(sineValue)):0:1, '°');
  WriteLn('  反余弦 ArcCos(', sineValue:0:1, ') = ', RadToDeg(ArcCos(sineValue)):0:1, '°');
  WriteLn('  反正切 ArcTan(', sineValue:0:1, ') = ', RadToDeg(ArcTan(sineValue)):0:1, '°');
end;

// 对数和指数函数示例
procedure LogarithmicAndExponentialFunctions;
var
  value: Double;
begin
  WriteLn('3. 对数和指数函数:');
  value := 10.0;
  
  WriteLn('  给定值 = ', value:0:1);
  WriteLn('  自然对数 Ln(', value:0:1, ') = ', Ln(value):0:6);
  WriteLn('  常用对数 Log10(', value:0:1, ') = ', Log10(value):0:6);
  WriteLn('  以2为底的对数 Log2(', value:0:1, ') = ', Log2(value):0:6);
  WriteLn('  指数函数 Exp(Ln(', value:0:1, ')) = ', Exp(Ln(value)):0:6);
  WriteLn('  2的幂 Power(2, ', value:0:1, ') = ', Power(2, value):0:2);
  WriteLn('  10的幂 IntPower(10, 3) = ', IntPower(10, 3):0:0);
end;

// 舍入和截断函数示例
procedure RoundingAndTruncationFunctions;
var
  value: Double;
begin
  WriteLn('4. 舍入和截断函数:');
  value := 3.7865;
  
  WriteLn('  给定值 = ', value:0:4);
  WriteLn('  四舍五入 Round(', value:0:4, ') = ', Round(value));
  WriteLn('  截断取整 Trunc(', value:0:4, ') = ', Trunc(value));
  WriteLn('  向下取整 Floor(', value:0:4, ') = ', Floor(value):0:0);
  WriteLn('  向上取整 Ceil(', value:0:4, ') = ', Ceil(value):0:0);
  WriteLn('  小数部分 Frac(', value:0:4, ') = ', Frac(value):0:4);
  
  value := -3.7865;
  WriteLn;
  WriteLn('  负值 = ', value:0:4);
  WriteLn('  四舍五入 Round(', value:0:4, ') = ', Round(value));
  WriteLn('  截断取整 Trunc(', value:0:4, ') = ', Trunc(value));
  WriteLn('  向下取整 Floor(', value:0:4, ') = ', Floor(value):0:0);
  WriteLn('  向上取整 Ceil(', value:0:4, ') = ', Ceil(value):0:0);
  WriteLn('  小数部分 Frac(', value:0:4, ') = ', Frac(value):0:4);
end;

// 特殊数学函数示例
procedure SpecialMathFunctions;
var
  x, y: Double;
begin
  WriteLn('5. 特殊数学函数:');
  x := 45.0;
  y := 60.0;
  
  WriteLn('  角度 x = ', x:0:1, '°, y = ', y:0:1, '°');
  WriteLn('  角度转弧度 DegToRad(', x:0:1, ') = ', DegToRad(x):0:6);
  WriteLn('  弧度转角度 RadToDeg(π/4) = ', RadToDeg(Pi/4):0:1);
  WriteLn('  两点间距离 Hypot(3, 4) = ', Hypot(3, 4):0:1);
  
  // 计算最大公约数和最小公倍数
  var a, b: Integer;
  a := 48;
  b := 18;
  WriteLn;
  WriteLn('  整数 a = ', a, ', b = ', b);
  WriteLn('  最大公约数 GCD(', a, ', ', b, ') = ', GCD(a, b));
  WriteLn('  最小公倍数 LCM(', a, ', ', b, ') = ', LCM(a, b));
end;

// 数学函数在实际问题中的应用示例
procedure PracticalMathApplications;
begin
  WriteLn('6. 数学函数在实际问题中的应用:');
  
  // 计算圆的面积和周长
  var radius: Double := 5.0;
  WriteLn('  圆的计算 (半径 = ', radius:0:1, '):');
  WriteLn('    面积 = π × r² = ', Pi * Sqr(radius):0:2);
  WriteLn('    周长 = 2 × π × r = ', 2 * Pi * radius:0:2);
  
  // 计算三角形面积 (海伦公式)
  var side1, side2, side3: Double;
  side1 := 3.0;
  side2 := 4.0;
  side3 := 5.0;
  WriteLn;
  WriteLn('  三角形面积计算 (边长 = ', side1:0:1, ', ', side2:0:1, ', ', side3:0:1, '):');
  var s: Double = (side1 + side2 + side3) / 2;  // 半周长
  var area: Double = Sqrt(s * (s - side1) * (s - side2) * (s - side3));
  WriteLn('    面积 = ', area:0:2);
  
  // 复利计算
  WriteLn;
  var principal: Double = 1000.0;  // 本金
  var rate: Double = 0.05;         // 年利率5%
  var time: Double = 10.0;         // 10年
  WriteLn('  复利计算 (本金 = ', principal:0:0, ', 年利率 = ', rate * 100:0:1, '%, 时间 = ', time:0:0, '年):');
  var amount: Double = principal * Power(1 + rate, time);
  WriteLn('    最终金额 = ', amount:0:2);
  WriteLn('    利息 = ', (amount - principal):0:2);
  
  // 统计计算
  WriteLn;
  var numbers: array[0..4] of Double = (10.5, 15.2, 8.7, 12.3, 18.9);
  WriteLn('  数组统计计算:');
  Write('    数据: ');
  var i: Integer;
  for i := 0 to 4 do
    Write(numbers[i]:0:1, ' ');
  WriteLn;
  
  // 计算平均值
  var sum: Double = 0;
  for i := 0 to 4 do
    sum := sum + numbers[i];
  var mean: Double = sum / 5;
  WriteLn('    平均值 = ', mean:0:2);
  
  // 计算标准差
  var variance: Double = 0;
  for i := 0 to 4 do
    variance := variance + Sqr(numbers[i] - mean);
  variance := variance / 5;
  var stdDev: Double = Sqrt(variance);
  WriteLn('    标准差 = ', stdDev:0:2);
end;

// 程序主入口
begin
  WriteLn('=== Pascal 数学函数示例 ===');
  WriteLn;
  
  // 1. 基本数学运算函数
  BasicMathFunctions;
  
  WriteLn;
  
  // 2. 三角函数
  TrigonometricFunctions;
  
  WriteLn;
  
  // 3. 对数和指数函数
  LogarithmicAndExponentialFunctions;
  
  WriteLn;
  
  // 4. 舍入和截断函数
  RoundingAndTruncationFunctions;
  
  WriteLn;
  
  // 5. 特殊数学函数
  SpecialMathFunctions;
  
  WriteLn;
  
  // 6. 数学函数在实际问题中的应用
  PracticalMathApplications;
  
  WriteLn;
  WriteLn('演示了 Pascal 中数学函数的各种用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.